#pragma once
#include "GCamera.h"
#include "Texture.h"

struct vertex_shader_payload
{
	Eigen::Vector4f	position;
	GCamera*		camera;
	Eigen::Vector4f texcoord0;
};

struct vertex_shader_output
{
	Eigen::Vector4f position;
	Eigen::Vector4f sv_position;
	Eigen::Vector4f texcoord0;
};

struct fragment_shader_payload
{
	GTexture* main_tex;
	Eigen::Vector4f view_position;
	Eigen::Vector4f uv;
};

class VertexShader
{
public:
	virtual vertex_shader_output CalcOutput(vertex_shader_payload) = 0;
};

class FragmentShader
{
public:
	virtual int CalcOutput(fragment_shader_payload) = 0;
};

class GVertexShader : public VertexShader
{
public:
	vertex_shader_output CalcOutput(vertex_shader_payload);
};

class GFragmentShader : public FragmentShader
{
public:
	int CalcOutput(fragment_shader_payload);
};